package xpn.platform.common.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;

/**
 * Adding custom behavior to all repositories
 *
 * @author bobatkm Oct 2, 2017
 *
 * @param <T>
 *            ： 实体泛型
 * @param <ID>
 *            ： id字段泛型 <br>
 *            jpql：{@link #filterByJpql(String)}<br>
 *            jpql：{@link #filterByJpql(String, Pageable, Sort)}<br>
 *            sql：{@link #filterBySql(String, Class)}<br>
 *            sql：{@link #filterBySql(String, Class, Pageable, Sort)}<br>
 *            jpql：{@link #findOne(String, Serializable)}
 *            jpql：{@link #findOne(String)}
 */
@NoRepositoryBean
public interface XpnRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {

	/**
	 * 根据指定的jpql进行查询，返回列表数据
	 *
	 * @param jpql
	 *            ： 查询JPQL
	 * @return
	 */
	List<T> filterByJpql(String jpql);

	/**
	 * 根据指定的jpql进行查询，返回分页数据
	 *
	 * @param jpql
	 *            ： 查询JPQL
	 * @param pageable
	 *            ：分页参数，遵循Spring data rest规范
	 * @param sort
	 *            ：排序规则，遵循Spring data rest规范
	 * @return
	 */
	Page<T> filterByJpql(String jpql, Pageable pageable, Sort sort);

	/**
	 * 根据指定的jpql进行查询，返回分页数据
	 *
	 * @param jpql
	 *            ： countJPQL
	 * @return
	 */
	Object countByJpql(String jpql);

	Object executeJpql(String jpql);

	/**
	 * 根据指定的sql进行查询，返回列表数据
	 *
	 * @param sql
	 *            ： 查询SQL
	 * @param resultClass
	 *            ： 结果对象的类
	 * @return
	 */
	List<T> filterBySql(String sql, @SuppressWarnings("rawtypes") Class resultClass);

	/**
	 * 根据指定的sql进行查询，返回列表数据
	 *
	 * @param sql
	 *            ： 查询SQL
	 * @param resultClass
	 *            ： 结果对象的类
	 * @param pageable
	 *            ：分页参数，遵循Spring data rest规范
	 * @param sort
	 *            ：排序规则，遵循Spring data rest规范
	 * @return
	 */
	Page<T> filterBySql(String sql, @SuppressWarnings("rawtypes") Class resultClass, Pageable pageable, Sort sort);

	/**
	 * 根据jpql和id查找实体
	 *
	 * @param jpql
	 *            ： 查询实体的jpql
	 * @param id
	 *            ： 实体id
	 * @return
	 */
	T findOneByJpql(String jpql, ID id);

	/**
	 * 根据jpql查找实体
	 *
	 * @param jpql
	 *            ： 查询实体的jpql
	 * @return
	 */
	T findOneByJpql(String jpql);

	/**
	 * 批量保存对象
	 *
	 * @param batchsaveEntity
	 *            ： 批量对象
	 * @ret
	 */
	List<T> batchsave(BatchSaveEntity<T> bachsaveEntiry);

	/**
	 * 根据ID查询
	 *
	 * @param Long id
	 */
}
